-- 获取请求头中的信息
local headers = ngx.req.get_headers()
-- 获取前端请求头中的token 
local aserptoken = headers["aserptoken"]

if not aserptoken then
	ngx.exit(ngx.HTTP_FORBIDDEN);
end

-- 连接配置信息
local config = require 'resty.config_constant'
--redis连接池工厂
local redis_factory = require('resty.redis_factory')(config.redisConfig) -- import config when construct
--获取redis的连接实例
local ok, redis_a = redis_factory:spawn('redis_a')
--在redis中获取key对应的值
local val = redis_a:get(aserptoken)

if val == ngx.null or val == nil then
	ngx.exit(ngx.HTTP_FORBIDDEN);
end

-- 刷新过期时间
redis_a:expire(aserptoken, 3600)

--获取初始化负载均衡服务器数据
local servers=ngx.shared.shared_cas_data
local index=ngx.shared.shared_cas_index

 if index ~= 1 then
	--排序
	 table.sort(servers, 
	     function (a,b)
		 return a.weight>b.weight
	     end 
	 )
 end

 --获取权重最大的
 local selected=servers[1]

 if index ~= 1 then
	--最大的变最小，其余权重全部+1。
	 selected.weight=1
	 for k,v in pairs(servers) do
	     if k ~= 1 then
		v.weight=v.weight+1
	     end
	 end
 end
 
 -- https://github.com/pintsized/lua-resty-http
local http = require 'resty.http'
-- https://github.com/rxi/json.lua
local json = require 'resty.json'

-- 获取http请求类型
local request_method = ngx.var.request_method

-- 将所有与请求相关的信息放到body变量中，统一转发
local body = {
    -- 获取请求uri，不包含查询参数
    url = ngx.var.uri,
    -- 获取请求参数
    query = ngx.req.get_uri_args(),
    -- http请求类型
    type = request_method,
    -- post的请求体
    post = nil
}

-- nginx location配置中set的$redirect_url变量
local redirect_url = 'http://'..selected.server..string.sub(body.url, 5)

-- 如果是post请求，则读取请求体，加入body变量中
if "POST" == request_method then 
    ngx.req.read_body()
    body.post = ngx.req.get_post_args()
end

-- 重新发起http请求
local httpc = http:new()
local res, err = httpc:request_uri(redirect_url, {
    -- 请求方法类型
    method = body.type,
    -- 将body编码为json格式
    body = json.encode(body),
    -- 请求头
    headers = headers
})

if not err then
    -- 返回响应体
    ngx.say(res.body)
end